/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.solr.rest.schema;

import org.apache.solr.rest.SolrRestletTestBase;
import org.junit.Test;

public class TestSchemaResource extends SolrRestletTestBase {
  @Test
  public void testXMLResponse() {
    // should work with or without trailing slash on '/schema/' path
    assertQ(
        "/schema/?indent=on&wt=xml",
        "count(/response/lst[@name='schema']/str[@name='name']) = 1",
        "/response/lst[@name='schema']/str[@name='name'][.='test-rest']",
        "count(/response/lst[@name='schema']/float[@name='version']) = 1",
        "/response/lst[@name='schema']/float[@name='version'][.='1.7']",
        "count(/response/lst[@name='schema']/str[@name='uniqueKey']) = 1",
        "/response/lst[@name='schema']/str[@name='uniqueKey'][.='id']",
        "(/response/lst[@name='schema']/arr[@name='fieldTypes']/lst/str[@name='name'])[1] = 'HTMLstandardtok'",
        "(/response/lst[@name='schema']/arr[@name='fieldTypes']/lst/str[@name='name'])[2] = 'HTMLwhitetok'",
        "(/response/lst[@name='schema']/arr[@name='fieldTypes']/lst/str[@name='name'])[3] = 'boolean'",
        "(/response/lst[@name='schema']/arr[@name='fields']/lst/str[@name='name'])[1] = 'HTMLstandardtok'",
        "(/response/lst[@name='schema']/arr[@name='fields']/lst/str[@name='name'])[2] = 'HTMLwhitetok'",
        "(/response/lst[@name='schema']/arr[@name='fields']/lst/str[@name='name'])[3] = '_version_'",
        "(/response/lst[@name='schema']/arr[@name='dynamicFields']/lst/str[@name='name'])[1] = '*_coordinate'",
        "(/response/lst[@name='schema']/arr[@name='dynamicFields']/lst/str[@name='name'])[2] = 'ignored_*'",
        "(/response/lst[@name='schema']/arr[@name='dynamicFields']/lst/str[@name='name'])[3] = '*_mfacet'",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='title']"
            + "                                                          and str[@name='dest'][.='title_stemmed']"
            + "                                                          and int[@name='maxChars'][.='200']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='title']"
            + "                                                          and str[@name='dest'][.='dest_sub_no_ast_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_i']"
            + "                                                          and str[@name='dest'][.='title']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_i']"
            + "                                                          and str[@name='dest'][.='*_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_i']"
            + "                                                          and str[@name='dest'][.='*_dest_sub_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_i']"
            + "                                                          and str[@name='dest'][.='dest_sub_no_ast_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_src_sub_i']"
            + "                                                          and str[@name='dest'][.='title']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_src_sub_i']"
            + "                                                          and str[@name='dest'][.='*_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_src_sub_i']"
            + "                                                          and str[@name='dest'][.='*_dest_sub_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='*_src_sub_i']"
            + "                                                          and str[@name='dest'][.='dest_sub_no_ast_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='src_sub_no_ast_i']"
            + "                                                          and str[@name='dest'][.='title']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='src_sub_no_ast_i']"
            + "                                                          and str[@name='dest'][.='*_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='src_sub_no_ast_i']"
            + "                                                          and str[@name='dest'][.='*_dest_sub_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='src_sub_no_ast_i']"
            + "                                                          and str[@name='dest'][.='dest_sub_no_ast_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='title_*']"
            + "                                                          and str[@name='dest'][.='text']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='title_*']"
            + "                                                          and str[@name='dest'][.='*_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='title_*']"
            + "                                                          and str[@name='dest'][.='*_dest_sub_s']]",
        "/response/lst[@name='schema']/arr[@name='copyFields']/lst[    str[@name='source'][.='title_*']"
            + "                                                          and str[@name='dest'][.='dest_sub_no_ast_s']]");
  }

  @Test
  public void testJSONResponse() throws Exception {
    // Should work with or without a trailing slash
    assertJQ(
        "/schema",
        "/schema/name=='test-rest'",
        "/schema/version==1.7",
        "/schema/uniqueKey=='id'",
        "/schema/fieldTypes/[0]/name=='HTMLstandardtok'",
        "/schema/fieldTypes/[1]/name=='HTMLwhitetok'",
        "/schema/fieldTypes/[2]/name=='boolean'",
        "/schema/fields/[0]/name=='HTMLstandardtok'",
        "/schema/fields/[1]/name=='HTMLwhitetok'",
        "/schema/fields/[2]/name=='_version_'",
        "/schema/dynamicFields/[0]/name=='*_coordinate'",
        "/schema/dynamicFields/[1]/name=='ignored_*'",
        "/schema/dynamicFields/[2]/name=='*_mfacet'",
        "/schema/copyFields/[1]=={'source':'src_sub_no_ast_i','dest':'title'}",
        "/schema/copyFields/[7]=={'source':'title','dest':'dest_sub_no_ast_s'}",
        "/schema/copyFields/[8]=={'source':'*_i','dest':'title'}",
        "/schema/copyFields/[9]=={'source':'*_i','dest':'*_s'}",
        "/schema/copyFields/[10]=={'source':'*_i','dest':'*_dest_sub_s'}",
        "/schema/copyFields/[11]=={'source':'*_i','dest':'dest_sub_no_ast_s'}",
        "/schema/copyFields/[12]=={'source':'*_src_sub_i','dest':'title'}",
        "/schema/copyFields/[13]=={'source':'*_src_sub_i','dest':'*_s'}",
        "/schema/copyFields/[14]=={'source':'*_src_sub_i','dest':'*_dest_sub_s'}",
        "/schema/copyFields/[15]=={'source':'*_src_sub_i','dest':'dest_sub_no_ast_s'}",
        "/schema/copyFields/[16]=={'source':'src_sub_no_ast_i','dest':'*_s'}",
        "/schema/copyFields/[17]=={'source':'src_sub_no_ast_i','dest':'*_dest_sub_s'}",
        "/schema/copyFields/[18]=={'source':'src_sub_no_ast_i','dest':'dest_sub_no_ast_s'}");
  }

  @Test
  public void testSchemaXmlResponse() {
    // should work with or without trailing slash on '/schema/' path
    assertQ(
        "/schema?wt=schema.xml",
        "/schema/@name = 'test-rest'",
        "/schema/@version = '1.7'",
        "/schema/uniqueKey = 'id'",
        "(/schema/fieldType)[1]/@name = 'HTMLstandardtok'",
        "(/schema/fieldType)[2]/@name = 'HTMLwhitetok'",
        "(/schema/fieldType)[3]/@name = 'boolean'",
        "(/schema/field)[1]/@name = 'HTMLstandardtok'",
        "(/schema/field)[2]/@name = 'HTMLwhitetok'",
        "(/schema/field)[3]/@name = '_version_'",
        "(/schema/dynamicField)[1]/@name = '*_coordinate'",
        "(/schema/dynamicField)[2]/@name = 'ignored_*'",
        "(/schema/dynamicField)[3]/@name = '*_mfacet'",
        "/schema/copyField[@source='title'][@dest='title_stemmed'][@maxChars='200']",
        "/schema/copyField[@source='title'][@dest='dest_sub_no_ast_s']",
        "/schema/copyField[@source='*_i'][@dest='title']",
        "/schema/copyField[@source='*_i'][@dest='*_s']",
        "/schema/copyField[@source='*_i'][@dest='*_dest_sub_s']",
        "/schema/copyField[@source='*_i'][@dest='dest_sub_no_ast_s']",
        "/schema/copyField[@source='*_src_sub_i'][@dest='title']",
        "/schema/copyField[@source='*_src_sub_i'][@dest='*_s']",
        "/schema/copyField[@source='*_src_sub_i'][@dest='*_dest_sub_s']",
        "/schema/copyField[@source='*_src_sub_i'][@dest='dest_sub_no_ast_s']",
        "/schema/copyField[@source='src_sub_no_ast_i'][@dest='title']",
        "/schema/copyField[@source='src_sub_no_ast_i'][@dest='*_s']",
        "/schema/copyField[@source='src_sub_no_ast_i'][@dest='*_dest_sub_s']",
        "/schema/copyField[@source='src_sub_no_ast_i'][@dest='dest_sub_no_ast_s']",
        "/schema/copyField[@source='title_*'][@dest='text']",
        "/schema/copyField[@source='title_*'][@dest='*_s']",
        "/schema/copyField[@source='title_*'][@dest='*_dest_sub_s']",
        "/schema/copyField[@source='title_*'][@dest='dest_sub_no_ast_s']");
  }
}
